/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager.consultar;

import br.com.deployment.entidade.protocolo.Pagamento;
import br.com.deployment.entidade.protocolo.Protocolo;
import br.com.deployment.entidade.protocolo.ServicoProtocolo;
import br.com.deployment.entidade.selo.TipoSelo;
import br.com.deployment.manager.ManagerPessoa;
import br.com.deployment.servico.LancamentoServico;
import br.com.deployment.servico.ParcelaServico;
import br.com.deployment.servico.ProtocoloServico;
import br.com.deployment.servico.SeloServico;
import br.com.deployment.servico.TipoSeloServico;
import br.com.deployment.util.VisaoLista;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;

/**
 *
 * @author elyjr
 */
@ManagedBean
@ViewScoped
public class ManagerConsultarCaixa implements Serializable{

    @EJB
    ProtocoloServico protocoloServico;
    @EJB
    ParcelaServico parcelaServico;
    @EJB
    LancamentoServico lancamentoServico;
    @EJB
    SeloServico seloServico;
    @EJB
    TipoSeloServico tipoSeloServico;
    List<Protocolo> lstProtocolo;
    private List<Pagamento> lstPagamento;
    private Date dataini, datafim;
    private BigDecimal valorCartorio;
    private BigDecimal valorFermojupi;
    private BigDecimal valorPagamento;
    private BigDecimal valorTotal;
    private BigDecimal valorRecebido;
    private BigDecimal valorAreceber;
    private Protocolo protocolo;
    private Integer qtdProtocolo;
    private Long qtdSelos;
    private List<Protocolo> lstProtocoloMesCaixa;
    private BigDecimal valorTotalMesCaixa;
    private BigDecimal valorTotalMesCartorio;
    private BigDecimal valorTotalMesFermoJupi;
    private CartesianChartModel categoryModel;
    private List<TipoSelo> tipoSelos;
    Map<Object, Number> m;
    private List<VisaoLista> lstvisaoLista;
    int cont;

    @PostConstruct
    public void init() {
        dataini = new Date();
        datafim = new Date();
        lstProtocolo = new ArrayList<Protocolo>();
        valorCartorio = new BigDecimal(0);
        valorFermojupi = new BigDecimal(0);
        valorTotalMesCartorio = new BigDecimal(0);
        valorTotalMesFermoJupi = new BigDecimal(0);
        valorTotalMesCaixa = new BigDecimal(0);
        qtdProtocolo = new Integer(0);
        valorRecebido = new BigDecimal(0);
        valorAreceber = new BigDecimal(0);
        valorPagamento = new BigDecimal(0);
        lstPagamento = new ArrayList<Pagamento>();
        valorTotal = new BigDecimal(0);
        protocolo = new Protocolo();
        lstProtocoloMesCaixa = new ArrayList<Protocolo>();
        tipoSelos = new ArrayList<TipoSelo>();
        lstvisaoLista = new ArrayList<VisaoLista>();
        atribuiValores();
        protocoloCaixaMes();
        createCategoryModel();
        seloEstoque();
    }

    private void createCategoryModel() {
        categoryModel = new CartesianChartModel();
        
        ChartSeries graMes = new ChartSeries();
        graMes.setLabel("Valores");
        
        HashMap<Integer, String> meses = new HashMap<Integer, String>();
        meses.put(1, "JAN");
        meses.put(2, "FEV");
        meses.put(3, "MAR");
        meses.put(4, "ABR");
        meses.put(5, "MAI");
        meses.put(6, "JUN");
        meses.put(7, "JUL");
        meses.put(8, "AGO");
        meses.put(9, "SET");
        meses.put(10, "OUT");
        meses.put(11, "NOV");
        meses.put(12, "DEZ");
        
        GregorianCalendar gc = new GregorianCalendar();
        int dia = 1;
        int mes = gc.get(Calendar.MONTH);
        int ano = gc.get(Calendar.YEAR);
        
        Calendar c = Calendar.getInstance();
        Calendar d = Calendar.getInstance();
        
        d.set(ano, mes - 2, dia);
        c.set(ano, mes - 1, dia);

        mes = mes - 2;
        for (int i = 0; i <= 2; i++) {
            
            
                BigDecimal valor =
                    protocoloServico.protocoloCaixaMesBig(d.getTime(), 
                        ((!c.after(new Date())) ? c.getTime(): new Date()) );
            
            System.err.println("Data: "+d.getTime()+" week "+c.getTime() + ""+ valor);
            graMes.set(meses.get(mes + i + 1 ), valor);
            d.add(Calendar.MONTH, 1);
            c.add(Calendar.MONTH, 1);
            
            
            if(valor.intValue() > cont){
                cont = valor.intValue() + (valor.intValue() / 10);
            }
            
        }
        categoryModel.addSeries(graMes);
    }
   
    public void seloEstoque() {
        lstProtocolo = protocoloServico.protocolosData(new Date());
        VisaoLista v = new VisaoLista();
        tipoSelos = tipoSeloServico.findAll();
        qtdSelos = new Long(0);
        qtdSelos = seloServico.qtdSeloSairamMes(new Date(), new Date());
        for (TipoSelo tipo : tipoSelos) {
            
            System.err.println(qtdSelos);
            Long n = seloServico.qtdSeloAll(tipo);
            v = new VisaoLista();
            v.setTipoSelo(tipo);
            v.setQtd(n);
            lstvisaoLista.add(v);
           
        }

    }

    public BigDecimal valorDoProtocolo(Protocolo protocolo) {
        BigDecimal total = new BigDecimal(0);
        protocolo = protocoloServico.find(protocolo.getId());
        protocolo.setServicoProtocolos(protocoloServico.servicoProtocolos(protocolo));
        
        for (ServicoProtocolo sp : protocolo.getServicoProtocolos()) {
            total = total.add(sp.getValor());
        }
        return total;
    }

    public BigDecimal resultadoValorPagamento() {
        valorPagamento = new BigDecimal(0);
        for (Pagamento p : lstPagamento) {
            valorPagamento = valorPagamento.add(p.getValor());
        }

        return valorPagamento;

    }

    public void atribuiValores() {
        
        valorCartorio = protocoloServico.protocoloCaixaMesCartorio(new Date(), new Date());
        valorFermojupi = protocoloServico.protocoloCaixaMesFerm(new Date(), new Date());
        valorTotal  = protocoloServico.protocoloCaixaMes(new Date(), new Date());


    }


  

    // Por Data Inicial e Final Caixa Mês 
    public List<Protocolo> protocoloCaixaMes() {
        GregorianCalendar gc = new GregorianCalendar();

        int dia = 1;
        int mes = gc.get(Calendar.MONTH);
        int ano = gc.get(Calendar.YEAR);
        System.out.println(mes);

        Calendar c = Calendar.getInstance();
        c.set(ano, mes, dia);
        System.out.println(c.getTime());

        valorRecebido = protocoloServico.caixaRecebido(new Date(),  new Date());
        valorAreceber = protocoloServico.caixaAreceber(new Date(),  new Date());
                
        valorTotalMesCaixa = protocoloServico.protocoloCaixaMes(c.getTime(),  new Date());
        valorTotalMesCartorio = protocoloServico.protocoloCaixaMesCartorio(c.getTime(),  new Date());
        valorTotalMesFermoJupi = protocoloServico.protocoloCaixaMesFerm(c.getTime(),  new Date());
        
        return lstProtocoloMesCaixa;

    }

    public void redirect(String s) {
        FacesContext context = FacesContext.getCurrentInstance();
        try {

            context.getExternalContext().redirect(s);


        } catch (IOException ex) {
            Logger.getLogger(ManagerPessoa.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    
    public List<Protocolo> getLstProtocolo() {
        return lstProtocolo;
    }

    public int getCont() {
        return cont;
    }

    public void setCont(int cont) {
        this.cont = cont;
    }

    public void setLstProtocolo(List<Protocolo> lstProtocolo) {
        this.lstProtocolo = lstProtocolo;
    }

    public Date getDatafim() {
        return datafim;
    }

    public void setDatafim(Date datafim) {
        this.datafim = datafim;
    }

    public Date getDataini() {
        return dataini;
    }

    public void setDataini(Date dataini) {
        this.dataini = dataini;
    }

    public List<Pagamento> getLstPagamento() {
        return lstPagamento = protocoloServico.pagamentosData(new Date());
    }

    public void setLstPagamento(List<Pagamento> lstPagamento) {
        this.lstPagamento = lstPagamento;
    }

    public BigDecimal getValorPagamento() {
        return valorPagamento = resultadoValorPagamento();
    }

    public void setValorPagamento(BigDecimal valorPagamento) {
        this.valorPagamento = valorPagamento;
    }

    public BigDecimal getValorCartorio() {
        return valorCartorio;
    }

    public void setValorCartorio(BigDecimal valorCartorio) {
        this.valorCartorio = valorCartorio;
    }

    public BigDecimal getValorFermojupi() {
        return valorFermojupi;
    }

    public void setValorFermojupi(BigDecimal valorFermojupi) {
        this.valorFermojupi = valorFermojupi;
    }

    public Protocolo getProtocolo() {
        return protocolo;
    }

    public void setProtocolo(Protocolo protocolo) {
        this.protocolo = protocolo;
    }

    public BigDecimal getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(BigDecimal valorTotal) {
        this.valorTotal = valorTotal;
    }

    public BigDecimal getValorRecebido() {
        return valorRecebido;
    }

    public void setValorRecebido(BigDecimal valorRecebido) {
        this.valorRecebido = valorRecebido;
    }

    public Long getQtdSelos() {
        return qtdSelos;
    }

    public void setQtdSelos(Long qtdSelos) {
        this.qtdSelos = qtdSelos;
    }


    public List<Protocolo> getLstProtocoloMesCaixa() {

        return lstProtocoloMesCaixa = protocoloCaixaMes();

    }

    public void setLstProtocoloMesCaixa(List<Protocolo> lstProtocoloMesCaixa) {
        this.lstProtocoloMesCaixa = lstProtocoloMesCaixa;
    }

    public BigDecimal getValorTotalMesCaixa() {
        return valorTotalMesCaixa;
    }

    public void setValorTotalMesCaixa(BigDecimal valorTotalMesCaixa) {
        this.valorTotalMesCaixa = valorTotalMesCaixa;
    }

    public BigDecimal getValorTotalMesCartorio() {
        return valorTotalMesCartorio;
    }

    public void setValorTotalMesCartorio(BigDecimal valorTotalMesCartorio) {
        this.valorTotalMesCartorio = valorTotalMesCartorio;
    }

    public BigDecimal getValorTotalMesFermoJupi() {
        return valorTotalMesFermoJupi;
    }

    public void setValorTotalMesFermoJupi(BigDecimal valorTotalMesFermoJupi) {
        this.valorTotalMesFermoJupi = valorTotalMesFermoJupi;
    }

    public CartesianChartModel getCategoryModel() {
        return categoryModel;
    }

    public void setCategoryModel(CartesianChartModel categoryModel) {
        this.categoryModel = categoryModel;
    }

    public BigDecimal getValorAreceber() {
        return valorAreceber;
    }

    public void setValorAreceber(BigDecimal valorAreceber) {
        this.valorAreceber = valorAreceber;
    }

    public Map<Object, Number> getM() {
        return m;
    }

    public void setM(Map<Object, Number> m) {
        this.m = m;
    }

    public List<TipoSelo> getTipoSelos() {
        return tipoSelos;
    }

    public void setTipoSelos(List<TipoSelo> tipoSelos) {
        this.tipoSelos = tipoSelos;
    }

    public List<VisaoLista> getLstvisaoLista() {
        return lstvisaoLista;
    }

    public void setLstvisaoLista(List<VisaoLista> lstvisaoLista) {
        this.lstvisaoLista = lstvisaoLista;
    }
}